package accountManagementNew.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;

/**
 * @Author：lihonbin
 * @Version：1.0.0
 * @Date:2025/9/23
 * @Description: JWT工具类
 */
@Component
public class JWTUtil {
    private static long EXPIRE_TIME; // 静态的不能使用@Value注入（Spring注入是依赖于类的）

    @Value("${jwt.expire-time}")
    private long expireTime; // 非静态注入字段

    @PostConstruct
    public void init() {
        EXPIRE_TIME = expireTime; // 初始化静态变量
    }
    // 密钥
    private static final Key SECRET = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    /**
     * 生成JWT令牌
     * @param username 用户名
     * @return JWT令牌
     */
    public static String generateToken(String username){
        return Jwts.builder()
                .setSubject(username) // 设置主题
                .setIssuedAt(new Date()) // 设置签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE_TIME))// 设置过期时间
                .signWith(SECRET)// 设置签名算法和密钥
                .compact();
    }

    /**
     * 获取令牌中的用户名
     * @param jwt 令牌
     * @return 用户名
     */
    public static String getUsername(String jwt){
        return getClaims(jwt).getBody().getSubject();
    }

    /**
     * 验证令牌
     * @param jwt 令牌
     * @return  验证结果
     */
    public static Boolean validateToken(String jwt){
        return getClaims(jwt).getBody().getExpiration().after(new Date());
    }

    /**
     * 获取令牌中的主题
     * @param jwt 令牌
     * @return 主题
     */
    private static Jws<Claims> getClaims(String jwt) {
        return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwt);
    }
}
